library(tidyverse)
library(dplyr)
books <- read_csv("data/books.csv")

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  bookID = col_double(),
  title = col_character(),
  authors = col_character(),
  average_rating = col_double(),
  isbn = col_character(),
  isbn13 = col_character(),
  language_code = col_character(),
  num_pages = col_double(),
  ratings_count = col_double(),
  text_reviews_count = col_double(),
  publication_date = col_character(),
  publisher = col_character()
)

21 parsing failures.
 row            col           expected            actual             file
1570 title          delimiter or quote                   'data/books.csv'
1570 title          delimiter or quote I                 'data/books.csv'
3349 average_rating a double           Jr./Sam B. Warner 'data/books.csv'
3349 num_pages      a double           en-US             'data/books.csv'
3349 NA             12 columns         13 columns        'data/books.csv'
.... .............. .................. ................. ................
See problems(...) for more details.
books
dim(books)
[1] 8472   12
is.na(books)
        bookID title authors average_rating  isbn isbn13 language_code num_pages ratings_count text_reviews_count publication_date publisher
   [1,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [2,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [3,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [4,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [5,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [6,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [7,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [8,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
   [9,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [10,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [11,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [12,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [13,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [14,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [15,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [16,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [17,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [18,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [19,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [20,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [21,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [22,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [23,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [24,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [25,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [26,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [27,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [28,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [29,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [30,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [31,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [32,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [33,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [34,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [35,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [36,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [37,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [38,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [39,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [40,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [41,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [42,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [43,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [44,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [45,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [46,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [47,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [48,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [49,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [50,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [51,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [52,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [53,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [54,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [55,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [56,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [57,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [58,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [59,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [60,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [61,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [62,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [63,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [64,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [65,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [66,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [67,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [68,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [69,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [70,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [71,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [72,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [73,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [74,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [75,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [76,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [77,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [78,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [79,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [80,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [81,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [82,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
  [83,]  FALSE FALSE   FALSE          FALSE FALSE  FALSE         FALSE     FALSE         FALSE              FALSE            FALSE     FALSE
 [ reached getOption("max.print") -- omitted 8389 rows ]
books
tidyverse_logo()
⬢ __  _    __   .    ⬡           ⬢  . 
 / /_(_)__/ /_ ___  _____ _______ ___ 
/ __/ / _  / // / |/ / -_) __(_-</ -_)
\__/_/\_,_/\_, /|___/\__/_/ /___/\__/ 
     ⬢  . /___/      ⬡      .       ⬢ 
nrow(books)
[1] 8472
ncol(books)
[1] 12
dim(books)
[1] 8472   12
names(books)
 [1] "bookID"             "title"              "authors"            "average_rating"     "isbn"               "isbn13"             "language_code"      "num_pages"         
 [9] "ratings_count"      "text_reviews_count" "publication_date"   "publisher"         
head(books, 10)
tail(books, 100)
tail(books, 1000)
NA
glimpse(books)
Rows: 8,472
Columns: 12
$ bookID             <dbl> 1, 2, 4, 5, 8, 9, 10, 12, 13, 14, 16, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 36, 37, 45, 50, 51, 53, 54, 55, 57, 58, 59, 61, …
$ title              <chr> "Harry Potter and the Half-Blood Prince (Harry Potter  #6)", "Harry Potter and the Order of the Phoenix (Harry Potter  #5)", "Harry Potter and…
$ authors            <chr> "J.K. Rowling/Mary GrandPré", "J.K. Rowling/Mary GrandPré", "J.K. Rowling", "J.K. Rowling/Mary GrandPré", "J.K. Rowling/Mary GrandPré", "W. Fr…
$ average_rating     <dbl> 4.57, 4.49, 4.42, 4.56, 4.78, 3.74, 4.73, 4.38, 4.38, 4.22, 4.22, 4.38, 4.21, 3.44, 3.87, 4.07, 3.90, 3.83, 3.86, 3.91, 3.93, 4.59, 4.50, 4.36…
$ isbn               <chr> "0439785960", "0439358078", "0439554896", "043965548X", "0439682584", "0976540606", "0439827604", "0517226952", "0345453743", "1400052920", "0…
$ isbn13             <chr> "9780439785969", "9780439358071", "9780439554893", "9780439655484", "9780439682589", "9780976540601", "9780439827607", "9780517226957", "97803…
$ language_code      <chr> "eng", "eng", "eng", "eng", "eng", "en-US", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", "eng", …
$ num_pages          <dbl> 652, 870, 352, 435, 2690, 152, 3342, 815, 815, 215, 6, 815, 544, 55, 256, 335, 304, 299, 254, 324, 270, 1728, 1184, 398, 1216, 218, 224, 558, …
$ ratings_count      <dbl> 2095690, 2153167, 6333, 2339585, 41428, 19, 28242, 3628, 249558, 4930, 1266, 2877, 248558, 7270, 2088, 72451, 49240, 45712, 48701, 80609, 2848…
$ text_reviews_count <dbl> 27591, 29221, 244, 36325, 164, 1, 808, 254, 4080, 460, 253, 195, 9396, 499, 131, 4245, 2211, 2257, 2238, 3301, 2085, 1550, 91, 13670, 140, 46,…
$ publication_date   <chr> "9/16/2006", "9/1/2004", "11/1/2003", "5/1/2004", "9/13/2004", "4/26/2005", "9/12/2005", "11/1/2005", "4/30/2002", "8/3/2004", "3/23/2005", "1…
$ publisher          <chr> "Scholastic Inc.", "Scholastic Inc.", "Scholastic", "Scholastic Inc.", "Scholastic", "Nimble Books", "Scholastic", "Gramercy Books", "Del Rey …
view(books)
books %>% 
  select(title, authors)
books %>% 
Error: Incomplete expression:   select(-title)
rated4.8+ <-
Error: unexpected assignment in "rated4.8+ <-"
  mutate(mean(ratings_count))
Error in mean(ratings_count) : object 'ratings_count' not found

#?????????????????????? #yesss!!!

books %>% 
  ratings_pubhouse <- group_by(publisher)
Error in group_by(publisher) : object 'publisher' not found
summarise(ratings_pubhouse, group_by(ratings_sth = n()))
Error: Problem with `summarise()` input `..1`.
x argument ".data" is missing, with no default
ℹ Input `..1` is `group_by(ratings_sth = n())`.
ℹ The error occurred in group 1: publisher = "10/18".
Run `rlang::last_error()` to see where the error occurred.
summarise(publishers_grouped, number_of_books_published = n()) %>%
  arrange(number_of_books_published)
`summarise()` ungrouping output (override with `.groups` argument)
fifty_most_read_books_above_average_rated
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgpgYGB7cn0KYm9va3MgPC0gcmVhZF9jc3YoImRhdGEvYm9va3MuY3N2IikKYGBgCgoKYGBge3J9CmJvb2tzCmBgYAoKCgpgYGB7cn0KZGltKGJvb2tzKQpgYGAKCgpgYGB7cn0KaXMubmEoYm9va3MpCmBgYAoKCgpgYGB7cn0KYm9va3MKYGBgCgoKCmBgYHtyfQp0aWR5dmVyc2VfbG9nbygpCmBgYAoKYGBge3J9Cm5yb3coYm9va3MpCmBgYAoKCgpgYGB7cn0KbmNvbChib29rcykKYGBgCgoKYGBge3J9CmRpbShib29rcykKYGBgCgoKCmBgYHtyfQpuYW1lcyhib29rcykKYGBgCgoKYGBge3J9CmhlYWQoYm9va3MsIDEwKQpgYGAKCgpgYGB7cn0KdGFpbChib29rcywgMTAwKQpgYGAKCgpgYGB7cn0KdGFpbChib29rcywgMTAwMCkKYGBgCgpgYGB7cn0KZ2xpbXBzZShib29rcykKYGBgCgoKYGBge3J9CnZpZXcoYm9va3MpCmBgYAoKCmBgYHtyfQpib29rcyAlPiUgCiAgc2VsZWN0KHRpdGxlLCBhdXRob3JzKQpgYGAKCgpgYGB7cn0KYm9va3MgJT4lIAogIHNlbGVjdCgtdGl0bGUpCmBgYAoKCmBgYHtyfQpib29rcyAlPiUgCiAgc3VtbWFyaXNlKGFjcm9zcyguZm5zID0gfnN1bShpcy5uYSgueCkpKSkKYGBgCgoKCmBgYHtyfQpib29rcyAlPiUgCiAgZmlsdGVyKGF2ZXJhZ2VfcmF0aW5nID09IDQuNjcpCmBgYAoKYGBge3J9CmJvb2tzICU+JSAKICBmaWx0ZXIobGFuZ3VhZ2VfY29kZSAhPSAiZW5nIikgJT4lIAogIHNlbGVjdCh0aXRsZSwgYXZlcmFnZV9yYXRpbmcsIGF1dGhvcnMpICU+JSAKICBmaWx0ZXIoYXZlcmFnZV9yYXRpbmcgPD0gNC4wMCkgJT4lIAogIGZpbHRlcihhdmVyYWdlX3JhdGluZyA+PSAzLjAwKQoKYGBgCgoKYGBge3J9CmJvb2tzICU+JSAKICBmaWx0ZXIobGFuZ3VhZ2VfY29kZSAhPSAiZW5nIikgJT4lIAogIHNlbGVjdCh0aXRsZSwgYXZlcmFnZV9yYXRpbmcsIGF1dGhvcnMpICU+JSAKICBmaWx0ZXIoYXZlcmFnZV9yYXRpbmcgPD0gNC4wMCB8IGF2ZXJhZ2VfcmF0aW5nID49IDMuMDApCmBgYAoKYGBge3J9CnJhdGVkNC44IDwtCmZpbHRlcihib29rcywgYXZlcmFnZV9yYXRpbmcgPiA0LjgwKQpgYGAKCmBgYHtyfQpyYXRlZDQuNyA8LQpmaWx0ZXIoYm9va3MsIGF2ZXJhZ2VfcmF0aW5nID4gNC43MCkKYGBgCgpgYGB7cn0KcmF0ZWQ0LjcKYGBgCgoKCgpgYGB7cn0KcmF0ZWQ0LjcgJT4lIAogIHNlbGVjdChhdXRob3JzLCBhdmVyYWdlX3JhdGluZywgcmF0aW5nc19jb3VudCkgJT4lIAogIGZpbHRlcihyYXRpbmdzX2NvdW50ID49IDEwMCkKYGBgCgoKCmBgYHtyfQpib29rcwpgYGAKCgoKCmBgYHtyfQpib29rcyAlPiUgCiAgYXJyYW5nZSh0aXRsZSkKYGBgCgpgYGB7cn0KYm9va3MgJT4lIAogIGFycmFuZ2UoYm9va0lEKQpgYGAKCgpgYGB7cn0KYXJyYW5nZShib29rcywgZGVzYyhhdmVyYWdlX3JhdGluZykpICU+JSAKICBzZWxlY3QoYXV0aG9ycywgYXZlcmFnZV9yYXRpbmcsIG51bV9wYWdlcykgJT4lIAogIGZpbHRlcihudW1fcGFnZXMgPj01MCkgJT4lIAogIGZpbHRlcihhdmVyYWdlX3JhdGluZyA+PTQuNikKYGBgCgpgYGB7cn0KYm9va3MKYGBgCgoKCmBgYHtyfQphdmdfcHVibGlzaGVyX3JhdGluZyA8LQpib29rcyAlPiUgCiAgYXJyYW5nZShwdWJsaXNoZXIpCiAgbXV0YXRlKG1lYW4ocmF0aW5nc19jb3VudCkpCmBgYAoKCmBgYHtyfQpib29rcyAlPiUgCiAgYXJyYW5nZShwdWJsaXNoZXIpCgpgYGAKCgoKCgpgYGB7cn0KYm9va3MgJT4lIAogIG11dGF0ZShhdmVyYWdlX3JhdGluZyAqIDUpCmBgYAoKYGBge3J9CmJvb2tzICU+JSAKICBtdXRhdGUobWVzc2VkX3VwX3BhZ2VfY291bnQgPSBudW1fcGFnZXMgLSA0MDApCmBgYAoKIz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8KI3llc3NzISEhCgpgYGB7cn0KYm9va3MgJT4lIAogIG11dGF0ZShhdmVyYWdlX3JhdGluZ19taXNzaW5nID0gaXMubmEoYXZlcmFnZV9yYXRpbmcpKSAlPiUgCiAgICBmaWx0ZXIoYXZlcmFnZV9yYXRpbmdfbWlzc2luZyA9PSBUUlVFKQoKCmBgYAoKCgpgYGB7cn0KYm9va3MgJT4lIAogICAgZmlsdGVyKHJhdGluZ3NfY291bnQgPT0gaXMubmEoRkFMU0UpKSAlPiUgCiAgbXV0YXRlKHJhdGluZ3NfY291bnRfdG90YWwgPSBzdW0ocmF0aW5nc19jb3VudCkpCmBgYAoKCgoKYGBge3J9CmJvb2tzICU+JSAgIAogIG11dGF0ZShyYXRpbmdzX2NvdW50X3RvdGFsID0gc3VtKHJhdGluZ3NfY291bnQsIG5hLnJtID0gVFJVRSkpCmBgYAoKCmBgYHtyfQpib29rcyAlPiUgCiAgbXV0YXRlKG1lYW5fYXZlcmFnZV9yYXRpbmcgPSBtZWFuKGF2ZXJhZ2VfcmF0aW5nLCBuYS5ybSA9IFRSVUUpKQpgYGAKCmBgYHtyfQpib29rcyAlPiUgCiBzdW1tYXJpc2UobWVhbl9hdmVyYWdlX3JhdGluZyA9IG1lYW4oYXZlcmFnZV9yYXRpbmcsIG5hLnJtID0gVFJVRSkpCmBgYAoKCgpgYGB7cn0KICByYXRpbmdzX3B1YmhvdXNlIDwtIAogIGJvb2tzICU+JSAKICBncm91cF9ieShwdWJsaXNoZXIpCmBgYAoKCgpgYGB7cn0KYm9va3MgJT4lIAogIHNlbGVjdChwdWJsaXNoZXIpCmBgYAoKCmBgYHtyfQpyYXRpbmdzX3B1YmhvdXNlCmBgYAoKCgoKCmBgYHtyfQpyYXRpbmdzX3B1YmhvdXNlICU+JSAKICBhcnJhbmdlKHB1Ymxpc2hlcikKCmBgYAoKCgpgYGB7cn0Kc3VtbWFyaXNlKHJhdGluZ3NfcHViaG91c2UsIGdyb3VwX2J5KHJhdGluZ3Nfc3RoID0gbigpKSkKCmBgYAoKYGBge3J9CnB1Ymxpc2hlcnNfZ3JvdXBlZCA8LQogIGdyb3VwX2J5KGJvb2tzLCBwdWJsaXNoZXIpCmBgYAoKYGBge3J9CgpzdW1tYXJpc2UocHVibGlzaGVyc19ncm91cGVkLCBudW1iZXJfb2ZfYm9va3NfcHVibGlzaGVkID0gbigpKSAlPiUKYGBgCgoKYGBge3J9CnB1Ymxpc2hlcnNfZ3JvdXBlZApgYGAKCgoKCmBgYHtyfQpodW5kcmVkX3RvX3RocmVlX2h1bmRyZWRfcGFnZXMgPC0gCiAgYm9va3MgJT4lIAogIGZpbHRlcihudW1fcGFnZXMgPj0gMTAwICYgbnVtX3BhZ2VzIDw9MzAwKQpgYGAKCmBgYHtyfQpodW5kcmVkX3RvX3RocmVlX2h1bmRyZWRfcGFnZXMKYGBgCgoKYGBge3J9Cmh1bmRyZWRfdG9fdGhyZWVfaHVuZHJlZF9wYWdlcyAlPiUgCiAgc3VtbWFyaXNlKG1lYW4oYXZlcmFnZV9yYXRpbmcpKQpgYGAKCgoKYGBge3J9CmZvdXJfaHVuZHJlZF90b19zaXhfaHVuZHJlZF9wYWdlcyA8LSAKICBib29rcyAlPiUgCiAgZmlsdGVyKG51bV9wYWdlcyA+PSA0MDAgJiBudW1fcGFnZXMgPD0gNjAwKQpgYGAKCmBgYHtyfQpmb3VyX2h1bmRyZWRfdG9fc2l4X2h1bmRyZWRfcGFnZXMKYGBgCgoKYGBge3J9CmZvdXJfaHVuZHJlZF90b19zaXhfaHVuZHJlZF9wYWdlcyAlPiUgCiAgc3VtbWFyaXNlKG1lYW4oYXZlcmFnZV9yYXRpbmcpKQpgYGAKYGBge3J9CmJvb2tzICU+JSAKICBzdW1tYXJpc2UobWVhbihhdmVyYWdlX3JhdGluZywgbmEucm0gPSBUUlVFKSkKYGBgCgoKCgoKCgoKYGBge3J9CmZpZnR5X21vc3RfcmVhZF9ib29rcyA8LQpib29rcyAlPiUgCiAgYXJyYW5nZShkZXNjKHJhdGluZ3NfY291bnQpKSAlPiUgCiAgaGVhZCg1MCkKYGBgCgoKYGBge3J9CmZpZnR5X21vc3RfcmVhZF9ib29rcwpgYGAKCgoKYGBge3J9CmZpZnR5X21vc3RfcmVhZF9ib29rc19hYm92ZV9hdmVyYWdlX3JhdGVkIDwtCmZpZnR5X21vc3RfcmVhZF9ib29rcyAlPiUgCiAgZmlsdGVyKGF2ZXJhZ2VfcmF0aW5nID4gMy45MzcpCmBgYAoKCgoKYGBge3J9CmZpZnR5X21vc3RfcmVhZF9ib29rc19iZWxvd19hdmVyYWdlX3JhdGVkIDwtCmZpZnR5X21vc3RfcmVhZF9ib29rcyAlPiUgCiAgZmlsdGVyKGF2ZXJhZ2VfcmF0aW5nIDwgMy45MzcpICU+JSAKICBhcnJhbmdlKGF2ZXJhZ2VfcmF0aW5nKQoKYGBgCgoKCmBgYHtyfQpmaWZ0eV9tb3N0X3JlYWRfYm9va3NfYmVsb3dfYXZlcmFnZV9yYXRlZCAlPiUgCiAgYXJyYW5nZShhdmVyYWdlX3JhdGluZykKCmBgYAoKCgpgYGB7cn0KZmlmdHlfbW9zdF9yZWFkX2Jvb2tzX2Fib3ZlX2F2ZXJhZ2VfcmF0ZWQgJT4lIAogIGFycmFuZ2UoYXZlcmFnZV9yYXRpbmcpCgoKYGBgCgoKYGBge3J9CmZpZnR5X21vc3RfcmVhZF9ib29rc19hYm92ZV9hdmVyYWdlX3JhdGVkCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==